package template.base;

/**
 * 饮料的超类  带钩子方法的咖啡类
 * 定义共性方法并实现它
 * 抽取同类型方法(算法) 让子类实现它
 *
 * @author yaojianfeng
 */
public abstract class BaseCaffeineBeverageWithHook {
    /**
     * 调制饮料的步骤是固定的
     * 不希望子类覆盖这个方法
     */
    public final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        /**
         * 我们加上了一个小小的条件语句,
         * 而该条件是否成立,是由一个具体方法决定的
         * 如果顾客"想要"调料,只有这时候我们才调用addCondiments();
         */
       if (customerWantsCondiments()){
           addCondiments();
       }
    }

    /**
     * 冲泡方法
     */
    public abstract void brew();

    /**
     * 添加配料的方法
     */
    public abstract void addCondiments();

    private void boilWater() {
        System.out.println("把水煮沸==>");
    }

    private void pourInCup() {
        System.out.println("把饮料倒入杯子中!");
    }

    /**
     * 默认不做事的方法 我们称这种方法为钩子
     * 子类可以视情况决定要不要覆盖它们
     * @return 超类
     */
    public boolean customerWantsCondiments(){
       return true;
    }

}
